Figuring out where the ball is when people are responding¶

Taking from our last meeting in trying to "simulate a participant's experience" I analysed the ball's location across the simulation trace as a function of RT.

For each stimulus, the empirical RT distribution is collected, and each RT sample is converted into simulation ticks with a simple equation (RT * 60 / 1000). These converted RT samples are then mapped to the corresponding location of the ball at that time in the simulation, and plotted as a point.

In [22]:
for file in json_files:
    # Get scene name
    scene = file.split('.')[0]
    # Set up figure
    fig, axs = plt.subplots(1,4,figsize=(32,10))
    # Ball trace
    trace = pilot4.scene_trace(loaddir+file)
    # Subset responses to the scene type
    df = responses.loc[(responses.scene_type == scene) & responses.scene_col == True][['rt','subject_id','experiment_version','scene_index','response']]
    # Convery RT into ticks
    df['tick'] = df.rt.apply(lambda x: int(x * 60 / 1000) if x < scene_to_ms[scene] else len(trace)-1)
    df['tick'] = df.tick.apply(lambda x: len(trace)-1 if x > len(trace)-1 else x)
    # Index locations based on RT
    df['x'] = df.tick.apply(lambda x: trace[x][0])
    df.x = df.x.apply(lambda x: x*np.random.normal(1,0.01))
    df['y'] = df.tick.apply(lambda x: trace[x][1])
    
    # Plot ball location as a function of RT
    g=sns.scatterplot(x="x", 
                      y="y", 
                      hue="experiment_version",
                      alpha=0.5,
                      data=df,
                      palette="tab10",
                      ax=axs[0])
    g.set(ylim=(0, 1000),xlim=(0,800))
    g.set_title("Locations of Ball as a function of RT")
    g.invert_yaxis()

    # Compute heatmap (2D histogram)
    x = df.loc[df.experiment_version == 4].x
    y = df.loc[df.experiment_version == 4].y
    s = 16
    img, extent = myplot(x, y, s)
    axs[1].imshow(img, extent=extent, origin='lower', cmap=cm.jet)
    axs[1].set_title("Smoothed 2D Histogram of RT data: Experiment 4")
    axs[1].invert_yaxis()
    
    # Compute heatmap (2D histogram)
    x = df.loc[df.experiment_version == 5].x
    y = df.loc[df.experiment_version == 5].y
    s = 16
    img, extent = myplot(x, y, s)
    axs[2].imshow(img, extent=extent, origin='lower', cmap=cm.jet)
    axs[2].set_title("Smoothed 2D Histogram of RT data: Experiment 5")
    axs[2].invert_yaxis()
    
    # Compute heatmap (2D histogram)
    x = df.loc[df.experiment_version == 6].x
    y = df.loc[df.experiment_version == 6].y
    s = 16
    img, extent = myplot(x, y, s)
    axs[3].imshow(img, extent=extent, origin='lower', cmap=cm.jet)
    axs[3].set_title("Smoothed 2D Histogram of RT data: Experiment 6")
    axs[3].invert_yaxis()

    plt.show()

hide_code_in_slideshow()
In [14]:
for file in json_files[:1]:
    scene = file.split('.')[0]
    for i in range(5):
        fig, axs = plt.subplots(1,6,figsize=(48,10),dpi=300)
        for j_idx,j in enumerate(range(i*3,i*3+3)):
            # Ball trace
            trace = pilot4.scene_trace(loaddir+file)
            df = responses.loc[(responses.scene_type == scene) 
                               & (responses.scene_col == 'yes') 
                               & (responses.scene_index == j+0.0)
                              ][
                ['rt',
                 'subject_id',
                 'experiment_version',
                 'scene_index',
                 'response']
            ]
            df['tick'] = df.rt.apply(lambda x: int(x * 60 / 1000) if x < scene_to_ms[scene] else len(trace)-1)
            df['tick'] = df.tick.apply(lambda x: len(trace)-1 if x > len(trace)-1 else x)
            df['x'] = df.tick.apply(lambda x: trace[x][0])
            df.x = df.x.apply(lambda x: x*np.random.normal(1,0.01))
            df['y'] = df.tick.apply(lambda x: trace[x][1])
            
            g=sns.scatterplot(x="x", 
                              y="y", 
                              hue="experiment_version",
                              alpha=0.5,
                              data=df,
                              palette="tab10",
                              ax=axs[j_idx*2])
            g.set(ylim=(0, 1000),xlim=(0,800),title=f"Scene {scene.split('_')[1]} index {j}")
            g.invert_yaxis()

            # Generate some test data
            x = df.x
            y = df.y
            s = 16
            img, extent = myplot(x, y, s)
            axs[j_idx*2+1].imshow(img, extent=extent, origin='lower', cmap=cm.jet)
            axs[j_idx*2+1].set_title(f"Scene {scene.split('_')[1]} index {j}")
            axs[j_idx*2+1].invert_yaxis()

        plt.show()
In [15]:
for file in json_files[1:2]:
    scene = file.split('.')[0]
    for i in range(5):
        fig, axs = plt.subplots(1,6,figsize=(48,10),dpi=300)
        for j_idx,j in enumerate(range(i*3,i*3+3)):
            # Ball trace
            trace = pilot4.scene_trace(loaddir+file)
            df = responses.loc[(responses.scene_type == scene) 
                               & (responses.scene_col == 'yes') 
                               & (responses.scene_index == j+0.0)
                              ][
                ['rt',
                 'subject_id',
                 'experiment_version',
                 'scene_index',
                 'response']
            ]
            df['tick'] = df.rt.apply(lambda x: int(x * 60 / 1000) if x < scene_to_ms[scene] else len(trace)-1)
            df['tick'] = df.tick.apply(lambda x: len(trace)-1 if x > len(trace)-1 else x)
            df['x'] = df.tick.apply(lambda x: trace[x][0])
            df.x = df.x.apply(lambda x: x*np.random.normal(1,0.01))
            df['y'] = df.tick.apply(lambda x: trace[x][1])
            
            g=sns.scatterplot(x="x", 
                              y="y", 
                              hue="experiment_version",
                              alpha=0.5,
                              data=df,
                              palette="tab10",
                              ax=axs[j_idx*2])
            g.set(ylim=(0, 1000),xlim=(0,800),title=f"Scene {scene.split('_')[1]} index {j}")
            g.invert_yaxis()

            # Generate some test data
            x = df.x
            y = df.y
            s = 16
            img, extent = myplot(x, y, s)
            axs[j_idx*2+1].imshow(img, extent=extent, origin='lower', cmap=cm.jet)
            axs[j_idx*2+1].set_title(f"Scene {scene.split('_')[1]} index {j}")
            axs[j_idx*2+1].invert_yaxis()

        plt.show()
In [16]:
for file in json_files[2:3]:
    scene = file.split('.')[0]
    for i in range(5):
        fig, axs = plt.subplots(1,6,figsize=(48,10),dpi=300)
        for j_idx,j in enumerate(range(i*3,i*3+3)):
            # Ball trace
            trace = pilot4.scene_trace(loaddir+file)
            df = responses.loc[(responses.scene_type == scene) 
                               & (responses.scene_col == 'yes') 
                               & (responses.scene_index == j+0.0)
                              ][
                ['rt',
                 'subject_id',
                 'experiment_version',
                 'scene_index',
                 'response']
            ]
            df['tick'] = df.rt.apply(lambda x: int(x * 60 / 1000) if x < scene_to_ms[scene] else len(trace)-1)
            df['tick'] = df.tick.apply(lambda x: len(trace)-1 if x > len(trace)-1 else x)
            df['x'] = df.tick.apply(lambda x: trace[x][0])
            df.x = df.x.apply(lambda x: x*np.random.normal(1,0.01))
            df['y'] = df.tick.apply(lambda x: trace[x][1])
            
            g=sns.scatterplot(x="x", 
                              y="y", 
                              hue="experiment_version",
                              alpha=0.5,
                              data=df,
                              palette="tab10",
                              ax=axs[j_idx*2])
            g.set(ylim=(0, 1000),xlim=(0,800),title=f"Scene {scene.split('_')[1]} index {j}")
            g.invert_yaxis()

            # Generate some test data
            x = df.x
            y = df.y
            s = 16
            img, extent = myplot(x, y, s)
            axs[j_idx*2+1].imshow(img, extent=extent, origin='lower', cmap=cm.jet)
            axs[j_idx*2+1].set_title(f"Scene {scene.split('_')[1]} index {j}")
            axs[j_idx*2+1].invert_yaxis()

        plt.show()
In [ ]: